#ifndef stack_h__lk53lj45lj6h45j23l45j234l5k6j345l6k546
#define stack_h__lk53lj45lj6h45j23l45j234l5k6j345l6k546

/**
 * Zasobnik
 */
int sTop = 0,     //spodek zasobniku! (... dej přednost jízdě)
    sIdx = 0,     //vrchol zasobniku
    sLen = 10000; //TODO kolik jich je presne?!?!!!
//unsigned char **stack = new unsigned char*[sLen]; //nutné někde smazat!
//int *sizes = new int[sLen]; //nutné někde smazat!
unsigned char **stack;
int *sizes;
bool sIsEmpty();


/**
 * Inicializace zásobníku
 */
void sInit( int maxLen ){
	sTop = 0;
	sIdx = 0;
    sLen = maxLen;
	stack = new unsigned char*[sLen];
	sizes = new int[sLen];
}

/**
 * Zrušení zásobníku
 */
void sDel(){
	//jednotlive permutace se mazou hned po pouziti
	delete[] stack;
	delete[] sizes;
}

//------------------------------------------------------------------------------
/**
 * Rozhodnutí, zda má cenu dělit zásobník
 */
bool sIsWorkToSend() {
	if(sIsEmpty())
		return false;
	else
		return (n - sizes[sTop]) >= 2;
}

/**
 * Přidání permutace o určité délce na vrchol zásobníku
 */
void sPush(unsigned char *prvek, const int len) {
    stack[sIdx] = prvek;
    sizes[sIdx] = len;
    ++sIdx;
}

/**
 * Odeslání (i odstranění) vrcholu zásobníku
 */
void sPop(unsigned char *&prvek, int &len) {
	if(sIsEmpty()) {
		prvek = NULL;
		len = 0;
		// aby se nemusel reinit, tak jen srovname indexy
		sTop = 0;
		sIdx = 0;
	} else {
    	--sIdx;
    	prvek = stack[sIdx];
		len   = sizes[sIdx]; 
	}
}

/**
 * Test prázdnosti zásobníku
 */
bool sIsEmpty() {
    return sIdx <= sTop;
}

/**
 * Rozdělení zásobníku na dvě části, jedna zůstává, druhá se odesílá
 * Všechny vstupní proměnné vrací návratovou hodnotu
 * topStack - část zásobníku
 * topLen - počet položek (permutací)
 * topSize - velikost položky (permutace) zásobníku (u všech je stejná)
 * Není nutné kopírovat do nového pole, místo po odeslaných se znovu už nepřepíše
 * NOTE je to dělané narychlo, za chvíli mi jede autobus, ani jsem si to nestačil po sobě přešíst, ale musím letět
 */
void sSplit(unsigned char*& topStack, int &topSize) { //XXX tady jsem zmenil ** na **& protoze si myslim, ze topStack musi byt reference abys do nej moch psat
	if(sIsWorkToSend()){
		topStack = stack[sTop];
		topSize = sizes[sTop];
		sTop++;
	} else {
		topStack = NULL;
		topSize = 0;
	}
}


#endif //stack_h__lk53lj45lj6h45j23l45j234l5k6j345l6k546
